package pascal.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import pascal.excepcion.DAOExcepcion;
import pascal.modelo.ImagenPublicacion;
import pascal.modelo.Publicacion;
import pascal.util.ConexionBD;

public class ImagenPublicacionDAO extends BaseDAO {

	public Collection<ImagenPublicacion> buscarPorNombre(String urlimagen)
			throws DAOExcepcion {
		String query = "select COD_PUBLICACION, COD_IMAGEN, STR_URLIMAGEN from imagenpublicacion where STR_URLIMAGEN like ?";
		Collection<ImagenPublicacion> lista = new ArrayList<ImagenPublicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + urlimagen + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				ImagenPublicacion vo = new ImagenPublicacion();
				vo.setCodPublicacion(rs.getInt("COD_PUBLICACION"));
				vo.setCodImagen(rs.getInt("COD_IMAGEN"));
				vo.setUrlImagen(rs.getNString("STR_URLIMAGEN"));
							     
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}
	
	
	public ImagenPublicacion insertar(ImagenPublicacion vo) throws DAOExcepcion {
		String query = "insert into imagenpublicacion(COD_PUBLICACION, STR_URLIMAGEN) values (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getCodPublicacion());
			stmt.setString(2, vo.getUrlImagen());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setCodPublicacion(id);;
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	
	public ImagenPublicacion obtener(int codPublicacion) throws DAOExcepcion {
		ImagenPublicacion vo = new ImagenPublicacion();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select COD_PUBLICACION, COD_IMAGEN, STR_URLIMAGEN from imagenpublicacion where STR_URLIMAGEN =?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codPublicacion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodPublicacion(rs.getInt(1));
				vo.setCodImagen(rs.getInt(2));
				vo.setUrlImagen(rs.getString(3));
				}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int codPublicacion) throws DAOExcepcion {
		String query = "delete from imagenpublicacion WHERE COD_PUBLICACION =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codPublicacion);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public ImagenPublicacion actualizar(ImagenPublicacion vo) throws DAOExcepcion {
		String query = "update categoria set STR_URLIMAGEN =?, COD_IMAGEN=? where STR_URLIMAGEN =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getUrlImagen());			
			stmt.setInt(2, vo.getCodImagen());
			stmt.setInt(3, vo.getCodPublicacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<ImagenPublicacion> listar() throws DAOExcepcion {
		Collection<ImagenPublicacion> c = new ArrayList<ImagenPublicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select COD_PUBLICACION, COD_IMAGEN, STR_URLIMAGEN from imagenpublicacion order by STR_URLIMAGEN ";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ImagenPublicacion vo = new ImagenPublicacion();
				vo.setCodPublicacion(rs.getInt("COD_PUBLICACION"));
				vo.setCodImagen(rs.getInt("COD_IMAGEN"));
				vo.setUrlImagen(rs.getString("STR_URLIMAGEN"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<ImagenPublicacion> listarMasDestacados() throws DAOExcepcion {
		Collection<ImagenPublicacion> c = new ArrayList<ImagenPublicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT distinct a.cod_publicacion, c.str_descripcion, a.str_titulo_publicacion, a.str_descripcion_publicacion, a.ind_condicion_publicacion, a.num_stock, a.dbl_precio_unitario, a.fec_fecha_vencimiento, a.num_cant_recomendacion, a.num_cantidad_click, b.str_urlimagen FROM publicacion a, imagenpublicacion b, categoria c where a.cod_publicacion = b.cod_publicacion and a.cod_categoria = c.cod_categoria order by num_cantidad_click desc limit 10 ";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ImagenPublicacion vo = new ImagenPublicacion();
				vo.setCodPublicacion(rs.getInt("COD_PUBLICACION"));
				vo.setDescripcionPublicacion(rs.getString("STR_DESCRIPCION_PUBLICACION"));
				vo.setTituloPublicacion(rs.getString("STR_TITULO_PUBLICACION"));
				vo.setCondicionPublicacion(rs.getString("IND_CONDICION_PUBLICACION"));
				vo.setStock(rs.getInt("NUM_STOCK"));
				vo.setPrecioUnitario(rs.getDouble("DBL_PRECIO_UNITARIO"));
				vo.setFechaVencimiento(rs.getDate("FEC_FECHA_VENCIMIENTO"));
				vo.setUrlImagen(rs.getString("STR_URLIMAGEN"));
				c.add(vo);
				
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<ImagenPublicacion> listarMasVendidos() throws DAOExcepcion {
		Collection<ImagenPublicacion> c = new ArrayList<ImagenPublicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT distinct a.cod_publicacion, c.str_descripcion, a.str_titulo_publicacion, a.str_descripcion_publicacion, a.ind_condicion_publicacion, a.num_stock, a.dbl_precio_unitario, a.fec_fecha_vencimiento, a.num_cant_recomendacion, a.num_cantidad_click, b.str_urlimagen FROM publicacion a, imagenpublicacion b, categoria c where a.cod_publicacion = b.cod_publicacion and a.cod_categoria = c.cod_categoria order by num_cant_recomendacion desc limit 10 ";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ImagenPublicacion vo = new ImagenPublicacion();
				vo.setCodPublicacion(rs.getInt("COD_PUBLICACION"));
				vo.setDescripcionPublicacion(rs.getString("STR_DESCRIPCION_PUBLICACION"));
				vo.setTituloPublicacion(rs.getString("STR_TITULO_PUBLICACION"));
				vo.setCondicionPublicacion(rs.getString("IND_CONDICION_PUBLICACION"));
				vo.setStock(rs.getInt("NUM_STOCK"));
				vo.setPrecioUnitario(rs.getDouble("DBL_PRECIO_UNITARIO"));
				vo.setFechaVencimiento(rs.getDate("FEC_FECHA_VENCIMIENTO"));
				vo.setUrlImagen(rs.getString("STR_URLIMAGEN"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}

